{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1 分析用户表"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>User-ID</th>\n",
       "      <th>Location</th>\n",
       "      <th>Age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>nyc, new york, usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>stockton, california, usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>moscow, yukon territory, russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>porto, v.n.gaia, portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>farnborough, hants, united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   User-ID                            Location   Age\n",
       "0        1                  nyc, new york, usa   NaN\n",
       "1        2           stockton, california, usa  18.0\n",
       "2        3     moscow, yukon territory, russia   NaN\n",
       "3        4           porto, v.n.gaia, portugal  17.0\n",
       "4        5  farnborough, hants, united kingdom   NaN"
      ]
     },
     "execution_count": 107,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user = pd.read_csv('./data/BX-Users.csv',sep=';')\n",
    "df_user.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>nyc, new york, usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>stockton, california, usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>moscow, yukon territory, russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>porto, v.n.gaia, portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>farnborough, hants, united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id                            location   age\n",
       "0        1                  nyc, new york, usa   NaN\n",
       "1        2           stockton, california, usa  18.0\n",
       "2        3     moscow, yukon territory, russia   NaN\n",
       "3        4           porto, v.n.gaia, portugal  17.0\n",
       "4        5  farnborough, hants, united kingdom   NaN"
      ]
     },
     "execution_count": 108,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.columns=['user_id','location','age']\n",
    "df_user.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 分析location"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {},
   "outputs": [],
   "source": [
    "location_value_counts = df_user['location'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "57339"
      ]
     },
     "execution_count": 110,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "location_value_counts.count()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 平均每个地区，存在的用户个数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4.863321648441723"
      ]
     },
     "execution_count": 111,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "location_value_counts.sum() / location_value_counts.count()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "####  location变成国家"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_user['location'] = df_user['location'].apply(lambda location:location.rsplit(',',maxsplit=1)[-1].strip())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "709"
      ]
     },
     "execution_count": 113,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(df_user['location'].unique())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {},
   "outputs": [],
   "source": [
    "location_value_counts = df_user['location'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "usa               139711\n",
       "canada             21658\n",
       "united kingdom     18538\n",
       "germany            17043\n",
       "spain              13147\n",
       "                   ...  \n",
       "unit                   1\n",
       "adsgfdr                1\n",
       "united state           1\n",
       "berguedà               1\n",
       "strongbadia            1\n",
       "Name: location, Length: 709, dtype: int64"
      ]
     },
     "execution_count": 115,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "location_value_counts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(\n",
    "    range(len(location_value_counts)),\n",
    "    location_value_counts,\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# location饼图占比\n",
    "plt.pie(\n",
    "    location_value_counts,\n",
    "    labels = location_value_counts.index\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 分析年龄"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id        location  age\n",
       "0        1             usa  NaN\n",
       "2        3          russia  NaN\n",
       "4        5  united kingdom  NaN\n",
       "6        7             usa  NaN\n",
       "7        8          canada  NaN"
      ]
     },
     "execution_count": 120,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user[\n",
    "    df_user['age'].isnull()\n",
    "].head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "user_id     110762\n",
       "location    110762\n",
       "age              0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 121,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user[\n",
    "    df_user['age'].isnull()\n",
    "].count()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 278858 entries, 0 to 278857\n",
      "Data columns (total 3 columns):\n",
      " #   Column    Non-Null Count   Dtype  \n",
      "---  ------    --------------   -----  \n",
      " 0   user_id   278858 non-null  int64  \n",
      " 1   location  278858 non-null  object \n",
      " 2   age       168096 non-null  float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 6.4+ MB\n"
     ]
    }
   ],
   "source": [
    "df_user.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0          True\n",
       "1         False\n",
       "2          True\n",
       "3         False\n",
       "4          True\n",
       "          ...  \n",
       "278853     True\n",
       "278854    False\n",
       "278855     True\n",
       "278856     True\n",
       "278857     True\n",
       "Name: age, Length: 278858, dtype: bool"
      ]
     },
     "execution_count": 125,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user['age'].isnull()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>6</td>\n",
       "      <td>usa</td>\n",
       "      <td>61.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>10</td>\n",
       "      <td>spain</td>\n",
       "      <td>26.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>11</td>\n",
       "      <td>australia</td>\n",
       "      <td>14.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    user_id   location   age\n",
       "1         2        usa  18.0\n",
       "3         4   portugal  17.0\n",
       "5         6        usa  61.0\n",
       "9        10      spain  26.0\n",
       "10       11  australia  14.0"
      ]
     },
     "execution_count": 126,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user_age_notnull = df_user[~df_user['age'].isnull()]\n",
    "df_user_age_notnull.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "metadata": {},
   "outputs": [],
   "source": [
    "#年龄的排序\n",
    "age_value_counts_sort_by_age = df_user_age_notnull['age'].value_counts().sort_index()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(\n",
    "    age_value_counts_sort_by_age.index,\n",
    "    age_value_counts_sort_by_age\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "metadata": {},
   "outputs": [],
   "source": [
    "def divide_age(age):\n",
    "    \"\"\"\n",
    "    :return:\n",
    "    Nan,0-6,>100  --> 0 年龄填写有误\n",
    "    7-12          -->1 少儿\n",
    "    13-17         -->2 青少年\n",
    "    18-45         -->3 青年\n",
    "    46-69         -->4 中年\n",
    "    70-100        -->5 老年\n",
    "    \"\"\"\n",
    "    if np.isnan(age) or (age<=6) or (age>100):\n",
    "        return 0\n",
    "    if age >=7 and age<=12:\n",
    "        return 1\n",
    "    if age >=13 and age<=17:\n",
    "        return 2\n",
    "    if age >=18 and age<=45:\n",
    "        return 3\n",
    "    if age >=46 and age<=69:\n",
    "        return 4\n",
    "    if age >=70 and age<=100:\n",
    "        return 5\n",
    "df_user['age']=df_user['age'].apply(divide_age)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id        location  age\n",
       "0        1             usa    0\n",
       "1        2             usa    3\n",
       "2        3          russia    0\n",
       "3        4        portugal    2\n",
       "4        5  united kingdom    0"
      ]
     },
     "execution_count": 130,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 分析年龄段"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.pie(\n",
    "    df_user['age'].value_counts().sort_index(),\n",
    "    labels = ['undefined','shaoer','qingshaonian','qingnian','zhongnian','laonian']\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 分析打分表"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>User-ID</th>\n",
       "      <th>ISBN</th>\n",
       "      <th>Book-Rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>276725</td>\n",
       "      <td>034545104X</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>276726</td>\n",
       "      <td>0155061224</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>276727</td>\n",
       "      <td>0446520802</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>276729</td>\n",
       "      <td>052165615X</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>276729</td>\n",
       "      <td>0521795028</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   User-ID        ISBN  Book-Rating\n",
       "0   276725  034545104X          0.0\n",
       "1   276726  0155061224          5.0\n",
       "2   276727  0446520802          0.0\n",
       "3   276729  052165615X          3.0\n",
       "4   276729  0521795028          6.0"
      ]
     },
     "execution_count": 132,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating = pd.read_csv('./data/BX-Book-Ratings.csv',sep = ';')\n",
    "df_rating.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 133,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>276725</td>\n",
       "      <td>034545104X</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>276726</td>\n",
       "      <td>0155061224</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>276727</td>\n",
       "      <td>0446520802</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>276729</td>\n",
       "      <td>052165615X</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>276729</td>\n",
       "      <td>0521795028</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id     item_id  rating\n",
       "0   276725  034545104X     0.0\n",
       "1   276726  0155061224     5.0\n",
       "2   276727  0446520802     0.0\n",
       "3   276729  052165615X     3.0\n",
       "4   276729  0521795028     6.0"
      ]
     },
     "execution_count": 133,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating.columns = ['user_id','item_id','rating']\n",
    "df_rating.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 1149780 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      " #   Column   Non-Null Count    Dtype  \n",
      "---  ------   --------------    -----  \n",
      " 0   user_id  1149780 non-null  int64  \n",
      " 1   item_id  1149780 non-null  object \n",
      " 2   rating   1149772 non-null  float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 26.3+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 删除有误数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<bound method DataFrame.info of          user_id      item_id  rating\n",
       "0         276725   034545104X     0.0\n",
       "1         276726   0155061224     5.0\n",
       "2         276727   0446520802     0.0\n",
       "3         276729   052165615X     3.0\n",
       "4         276729   0521795028     6.0\n",
       "...          ...          ...     ...\n",
       "1149775   276704   1563526298     9.0\n",
       "1149776   276706   0679447156     0.0\n",
       "1149777   276709   0515107662    10.0\n",
       "1149778   276721   0590442449    10.0\n",
       "1149779   276723  05162443314     8.0\n",
       "\n",
       "[1149772 rows x 3 columns]>"
      ]
     },
     "execution_count": 135,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating = df_rating.dropna()\n",
    "df_rating.info"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 用户活跃度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "metadata": {},
   "outputs": [],
   "source": [
    "user_value_counts = df_rating['user_id'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(\n",
    "    range(len(user_value_counts)),\n",
    "    user_value_counts,\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "商品流行度分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "item_value_counts = df_rating['item_id'].value_counts()\n",
    "plt.plot(\n",
    "    range(len(item_value_counts)),\n",
    "    item_value_counts,\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      " #   Column   Non-Null Count    Dtype  \n",
      "---  ------   --------------    -----  \n",
      " 0   user_id  1149772 non-null  int64  \n",
      " 1   item_id  1149772 non-null  object \n",
      " 2   rating   1149772 non-null  float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 35.1+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      " #   Column   Non-Null Count    Dtype \n",
      "---  ------   --------------    ----- \n",
      " 0   user_id  1149772 non-null  int64 \n",
      " 1   item_id  1149772 non-null  object\n",
      " 2   rating   1149772 non-null  int64 \n",
      "dtypes: int64(2), object(1)\n",
      "memory usage: 35.1+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating['rating'] = df_rating['rating'].astype(int)\n",
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 合并用户表与打分表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 141,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id        location  age\n",
       "0        1             usa    0\n",
       "1        2             usa    3\n",
       "2        3          russia    0\n",
       "3        4        portugal    2\n",
       "4        5  united kingdom    0"
      ]
     },
     "execution_count": 141,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>276725</td>\n",
       "      <td>034545104X</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>276726</td>\n",
       "      <td>0155061224</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>276727</td>\n",
       "      <td>0446520802</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>276729</td>\n",
       "      <td>052165615X</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>276729</td>\n",
       "      <td>0521795028</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id     item_id  rating\n",
       "0   276725  034545104X       0\n",
       "1   276726  0155061224       5\n",
       "2   276727  0446520802       0\n",
       "3   276729  052165615X       3\n",
       "4   276729  0521795028       6"
      ]
     },
     "execution_count": 142,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 143,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0195153448</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>034542252</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0002005018</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0060973129</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0374157065</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id location  age     item_id  rating\n",
       "0        2      usa    3  0195153448       0\n",
       "1        7      usa    0   034542252       0\n",
       "2        8   canada    0  0002005018       5\n",
       "3        8   canada    0  0060973129       0\n",
       "4        8   canada    0  0374157065       0"
      ]
     },
     "execution_count": 143,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_data = pd.merge(\n",
    "    df_user,\n",
    "    df_rating,\n",
    "    on='user_id',\n",
    "    how='inner',\n",
    ")\n",
    "df_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149771\n",
      "Data columns (total 5 columns):\n",
      " #   Column    Non-Null Count    Dtype \n",
      "---  ------    --------------    ----- \n",
      " 0   user_id   1149772 non-null  int64 \n",
      " 1   location  1149772 non-null  object\n",
      " 2   age       1149772 non-null  int64 \n",
      " 3   item_id   1149772 non-null  object\n",
      " 4   rating    1149772 non-null  int64 \n",
      "dtypes: int64(3), object(2)\n",
      "memory usage: 52.6+ MB\n"
     ]
    }
   ],
   "source": [
    "df_data.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_data['age'] = df_data['age'].astype(int)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 保存表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "metadata": {},
   "outputs": [],
   "source": [
    "import _pickle as cPickle"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 147,
   "metadata": {},
   "outputs": [],
   "source": [
    "cPickle.dump(\n",
    "    df_data,\n",
    "    open('./data/df_data.pk1','wb')\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 148,
   "metadata": {},
   "outputs": [],
   "source": [
    "object1 = cPickle.load(\n",
    "    open('./data/df_data.pk1','rb')\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "         user_id location  age     item_id  rating\n",
      "0              2      usa    3  0195153448       0\n",
      "1              7      usa    0   034542252       0\n",
      "2              8   canada    0  0002005018       5\n",
      "3              8   canada    0  0060973129       0\n",
      "4              8   canada    0  0374157065       0\n",
      "...          ...      ...  ...         ...     ...\n",
      "1149767   278854      usa    0  0425163393       7\n",
      "1149768   278854      usa    0  0515087122       0\n",
      "1149769   278854      usa    0  0553275739       6\n",
      "1149770   278854      usa    0  0553578596       0\n",
      "1149771   278854      usa    0  0553579606       8\n",
      "\n",
      "[1149772 rows x 5 columns]\n"
     ]
    }
   ],
   "source": [
    "print(object1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
